# 面向对象3大特性
# 封装、继承、多态
# 封装 隐藏对象中一些不希望被外部所访问到的属性或方法

# 私有属性：只允许在类的内部使用，无法通过对象访问 属性名/方法名前加__ 子类不会继承，通过from xxx import * 无法导入
class Person:
    __name = 'test'
    def get_name(self):
        return Person.__name
print(Person.__name)
# person = Person()
#
# # print(person.name)

#
# # 第一种：隐藏属性实际上是将名字修改为：_类名__属性名
# print(person._Person__name)
#
# # 第二种 定义set/get函数
# print(person.get_name())

# 受保护属性/方法 属性名/方法名前加_  外部可以使用，子类可以继承、在另一个py文件通过from xxx import * 无法导入
# 一般是为了避免与python关键字冲突而采用的命名方法
class Person:
    name = 'test'
    _age = 18
    __sex = 'man'

    def __play(self):
        print('__play')

    def fun(self):
        # self.__play()
        Person.__play(self)
        print('fun')

# print(Person.name)
# print(Person._age)
# # print(Person.__sex) 报错
person = Person()
# print(person.name)
# print(person._age)
# print(person.__sex) 报错
person.fun()